import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main 
{

	public class Token{

		private int fila;
		private int columna;

		public int	PARI	=	1,
					PARD	=	2,
					PYC		=	3,
					ASIG	=	4,
					CLASS	=	5,
					DOUBLE	=	6,
					INT		=	7,
					MAIN	=	8,
					VOID	=	9,
					LLAVEI	=	10,
					LLAVED	=	11,
					ENTERO	=	12,
					ID		=	13,
					REAL	=	14,
					COMENTARIO = 15,
					ERROR = 69;

		public String Tipos[] = {	"(",
									")",
									";",
									"=",
									"class",
									"double",
									"int",
									"main",
									"void",
									"{",
									"}",
									"entero",
									"id",
									"real",
									"comentario" };

		private String cadena;	//Cadena que se muestra
		private int tipo;		//Tipo del token.


		public Token (int t, int fila, int columna)
		{
			tipo = t;
		}

		public Token (String p, int t, int fila, int columna)
		{
			cadena = p;

			tipo = t;
		}

		public Token (Token t)
		{
			cadena = t.cadena;
			tipo = t.tipo;
			fila = t.fila;
			columna = t.columna;
		}

		@Override
		public String toString()
		{
			if (tipo == ID || tipo == ENTERO || tipo == REAL || tipo == COMENTARIO)
			{
				return cadena;
			}
			else
			{
				return Tipos[tipo-1];
			}
		}
	}

	public class ALexico{
		
		private int fila; //fila
		private int columna; //columna

		private String cola;
		private String actual;

		private RandomAccessFile fichero;

		public ALexico(String path)
		{
			fila = 0;
			columna = 0;
			try
			{
				fichero = new RandomAccessFile(path, "r");
			}
			catch (FileNotFoundException ex)
			{
				System.out.println("Error. El fichero no existe");
			}
			finally
			{
				System.out.println("Fichero abierto correctamente");
			}
		}

		public Token nextToken()
		{
			Token t = null;
			char c;

			int f = fila;
			int k = columna;

			cola ="";
			actual ="";

			try
			{
				c = fichero.readChar();

				while (c == '\n' || c ==' ' || c == '\t')
				{
					if (c == '\n')
					{
						columna = 0;
						fila ++;
					}
					else
					{
						columna++;
					}
					c = fichero.readChar();
				}

				switch (c)
				{
					case '(':
						return new Token(t.PARI, f, k);
					case ')':
						return new Token(t.PARD, f, k);
					case ';' :
						return new Token(t.PYC, f, k);
					case '=':
						return new Token(t.ASIG, f, k);
					case '{':
						return new Token(t.LLAVEI, f, k);
					case '}':
						return new Token(t.LLAVED, f, k);
				}

				do
				{
					c = fichero.readChar();
					cola += c;
				} while (c != ' ' && c != '\t' && c != '\n' && c != '(' && c!= ')' && c != '=' && c!='{' && c!='}');

				if ( cola.equals(t.Tipos[t.CLASS]) )
					return new Token(t.CLASS, f, k);
				if ( cola.equals(t.Tipos[t.DOUBLE]) )
					return new Token(t.DOUBLE, f, k);
				if ( cola.equals(t.Tipos[t.INT]) )
					return new Token(t.INT, f, k);
				if ( cola.equals(t.Tipos[t.MAIN]) )
					return new Token(t.MAIN, f, k);
				if ( cola.equals(t.Tipos[t.VOID]) )
					return new Token(t.VOID, f, k);

				if (cola.length() > 1 && cola.charAt(0) == '/' && cola.charAt(1) == '*')
				{
					while (!(cola.charAt(cola.length()-2)=='*' && cola.charAt(cola.length()-1)=='/'))
					{
						c = fichero.readChar();
						if (c == '\n')
						{
							columna = 0;
							fila ++;
						}
						else
						{
							columna++;
						}

						cola += c;

					}

					return new Token(cola, t.COMENTARIO, f, k);
				}

				if (		(cola.charAt(0) >= 'a' && cola.charAt(0) <= 'z' )
						||	(cola.charAt(0) >= 'A' && cola.charAt(0) <= 'Z' ))
				{
					return new Token(cola, t.ID, f, k);
				}
				

				//Falta entero y double
				else
				{
					try
					{
						Integer.parseInt(cola);
					}
					catch(NumberFormatException exInt)
					{
						try
						{
							Double.parseDouble(cola);
						}
						catch(NumberFormatException exDouble)
						{
							return new Token(cola, t.ERROR, f, k);
						}
						finally
						{
							return new Token(cola, t.DOUBLE, f, k);
						}
					}
					finally
					{
						return new Token(cola, t.ENTERO, f, k);
					}
				}
			} catch (IOException ex)
			{
				Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
			}
			finally
			{
				return null;
			}
		}
		


	}

	public static void main(String[] args) 
	{
		ALexico aLexico = new ALexico(args[1]);
	}

}
